"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
// 接口的兼容性, ts跟类型没有关系，只跟属性有关系
var a;
(function (a_1) {
    function getName(animal) {
        return animal.name;
    }
    var a = {
        name: 'lei',
        age: 20,
    };
    var p = {
        name: 'wu',
        age: 27,
        speak: function () {
            console.log('speak');
        }
    };
    // 按理说这个getName方法接受一个animal对象实例，但是实际上这里传入一个Person对象也可以，
    // 只要name属性就可以
    console.log(getName(p));
    console.log(getName(a));
    // 基本类型的兼容性
    var num; // 具体类型会随着后面的变化而变化
    var str;
    num = 12;
    num = '111';
    var num2;
    var str2 = 'aaa';
    num2 = str2;
    num2 = 12;
})(a || (a = {}));
var b;
(function (b_1) {
    // 类的兼容性 跟类型无关,只要`有我要的属性就行`
    var Animal = /** @class */ (function () {
        function Animal() {
        }
        return Animal;
    }());
    var Bird = /** @class */ (function (_super) {
        __extends(Bird, _super);
        function Bird() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return Bird;
    }(Animal));
    var a;
    a = new Bird(); // 跟类型无关，只要Bird中有name属性即可
    var b;
    b = new Animal(); // 这样也行
    var c = { name: 'asa' };
    b = c; // 也能赋值给b实例，因为c中有name属性
    // a = {name: 'ss',age:23} // Animal实例中没有age属性，`所以报错`
})(b || (b = {}));
